热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

也就是|程度_看Feign的源码一定要看这个类

篇首语:本文由编程笔记#小编为大家整理,主要介绍了看Feign的源码一定要看这个类相关的知识,希望对你有一定的参考价值。@[TOC

篇首语:本文由编程笔记#小编为大家整理,主要介绍了看Feign的源码一定要看这个类相关的知识,希望对你有一定的参考价值。



@[TOC]


看Feign的源码一定要看这个类

RefectiveFeign是Feign的具体实现类,它可以生成动态代理对象


动态代理对象的创建

RefectiveFeign的newInstance()方法创建RPC动态代理的实例

RefectiveFeign的newInstance方法:

@Override
public T newInstance(Target target)
Map nameToHandler = targetToHandlersByName.apply(target);
Map methodToHandler = new LinkedHashMap();
List defaultMethodHandlers = new LinkedList();
for (Method method : target.type().getMethods())
if (method.getDeclaringClass() == Object.class)
continue;
else if(Util.isDefault(method))
DefaultMethodHandler handler = new DefaultMethodHandler(method);
defaultMethodHandlers.add(handler);
methodToHandler.put(method, handler);
else
methodToHandler.put(method, nameToHandler.get(Feign.configKey(target.type(), method)));


InvocationHandler handler = factory.create(target, methodToHandler);
T proxy = (T) Proxy.newProxyInstance(target.type().getClassLoader(), new Class[]target.type(), handler);
for(DefaultMethodHandler defaultMethodHandler : defaultMethodHandlers)
defaultMethodHandler.bindTo(proxy);

return proxy;


  1. 解析远程接口的方法,每个方法创建一个MethodHandler方法处理器,nameToHandler的key是方法名,value是方法对应的MethodHandler

  2. 创建methodToHandler,key是method,value是方法对应的MethodHandler

  3. 创建调用处理器InvocationHandler

  4. 通过调用Proxy.newProxyInstance()创建一个动态代理实例


方法解析器的创建

方法解析器的创建通过SynchronousMethodHandler的 create方法完成的,在此之前需要通过Contract调用parseAndValidatateMetadata方法返回方法元数据列表,默认Contract是用的Spring MVC的SpringMvcContract

public MethodHandler create(Target target, MethodMetadata md,
RequestTemplate.Factory buildTemplateFromArgs,
Options options, Decoder decoder, ErrorDecoder errorDecoder)
return new SynchronousMethodHandler(target, client, retryer, requestInterceptors, logger,
logLevel, md, buildTemplateFromArgs, options, decoder,
errorDecoder, decode404, closeAfterDecode);

调用处理器的创建

调用处理器的创建是通过InvocationHandlerFactory 的create方法,默认类是通过Default的create方法创建,也就是创建FeignInvocationHandler的实例。

static final class Default implements InvocationHandlerFactory
@Override
public InvocationHandler create(Target target, Map dispatch)
return new ReflectiveFeign.FeignInvocationHandler(target, dispatch);


总结

这篇文章主要对RefectiveFeign的newInstance()方法进行分析,newInstance()方法主要是创建RPC动态代理的实例,过程是先进行方法解析,针对每一个方法创建对应的方法处理器,然后创建调用处理器InvocationHandler,用到的类是默认是FeignInvocationHandler,然后通过java的JDK的Proxy.newProxyInstance方法来创建出一个动态的代理对象。协议解析类Contract调用的是springMVC的SpringMvcContract协议规则解析类,使用SpringMvcContract协议规则解析类对于开发人员来说不需要重新进行学习,降低了开发成本和维护程度,远程调用RPC的方法注解和服务端提供的方法注解保持一致。虽然feign有自己的默认协议规则,但是没有使用。


推荐阅读
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • Flowable 流程图路径与节点展示:已执行节点高亮红色标记,增强可视化效果
    在Flowable流程图中,通常仅显示当前节点,而路径则需自行获取。特别是在多次驳回的情况下,节点可能会出现混乱。本文重点探讨了如何准确地展示流程图效果,包括已结束的流程和正在执行的流程。具体实现方法包括生成带有高亮红色标记的图片,以增强可视化效果,确保用户能够清晰地了解每个节点的状态。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 本文介绍了如何在 Spring 3.0.5 中使用 JdbcTemplate 插入数据并获取 MySQL 表中的自增主键。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细解析了Autofac在高级应用场景中的具体实现,特别是如何通过注册泛型接口的类来优化依赖注入。示例代码展示了如何使用 `builder.RegisterAssemblyTypes` 方法,结合 `typeof(IEventHandler).Assembly` 和 `Where` 过滤条件,动态注册所有符合条件的类,从而简化配置并提高代码的可维护性。此外,文章还探讨了这一方法在复杂系统中的实际应用及其优势。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
author-avatar
吴振华0575_762
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有